package com.hb.trade.api.routine.config.pay; //

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * 支付宝支付成功回调实体类
 *
 * @author zhaojk
 */
@Setter
@Getter
public class AlipayNotifyResponse {
    /**
     * 通知时间
     * 通知的发送时间, 格式为yyyy-MM-dd HH:mm:ss
     */
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime notify_time;
    /**
     * 通知的类型
     */
    private String notify_type;
    /**
     * 通知校验ID
     */
    private String notify_id;
    /**
     * 支付宝分配给开发者的应用Id
     */
    private String app_id;
    /**
     * 编码格式
     */
    private String charset;
    /**
     * 调用的接口版本，固定为：1.0
     */
    private String version;
    /**
     * 签名类型
     * 商户生成签名字符串所使用的签名算法类型，目前支持RSA2和RSA，推荐使用RSA2
     */
    private String sign_type;
    /**
     * 异步返回结果的验签
     */
    private String sign;
    /**
     * 支付宝交易凭证号
     */
    private String trade_no;
    /**
     * 商户订单号
     * 原支付请求的商户订单号
     */
    private String out_trade_no;
    /**
     * 商户业务号
     * 商户业务ID，主要是退款通知中返回退款申请的流水号
     */
    private String out_biz_no;
    /**
     * 买家支付宝用户号
     * 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字	2088102122524333
     */
    private String buyer_id;
    /**
     * 买家支付宝账号
     */
    private String buyer_logon_id;
    /**
     * 卖家支付宝用户号
     */
    private String seller_id;
    /**
     * 卖家支付宝账号
     */
    private String seller_email;
    /**
     * 交易目前所处的状态
     * WAIT_BUYER_PAY       交易创建，等待买家付款
     * TRADE_CLOSED         未付款交易超时关闭，或支付完成后全额退款
     * TRADE_SUCCESS        交易支付成功
     * TRADE_FINISHED       交易结束，不可退款
     */
    private String trade_status;
    /**
     * 本次交易支付的订单金额，单位为人民币（元）
     */
    private BigDecimal total_amount;
    /**
     * 商家在交易中实际收到的款项, 单位为元
     */
    private BigDecimal receipt_amount;
    /**
     * 用户在交易中支付的可开发票的金额
     */
    private BigDecimal invoice_amount;
    /**
     * 付款金额
     * 用户在交易中支付的金额
     */
    private BigDecimal buyer_pay_amount;
    /**
     * 集分宝金额
     * 使用集分宝支付的金额
     */
    private BigDecimal point_amount;
    /**
     * 总退款金额
     */
    private BigDecimal refund_fee;
    /**
     * 商品的标题/交易标题/订单标题/订单关键字等，是请求时对应的参数，原样通知回来
     */
    private String subject;
    /**
     * 该订单的备注、描述、明细等。对应请求时的body参数，原样通知回来
     */
    private String body;
    /**
     * 交易创建时间
     */
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime  gmt_create;
    /**
     * 交易付款时间
     */
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime  gmt_payment;
    /**
     * 交易退款时间
     */
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime  gmt_refund;
    /**
     * 交易结束时间
     */
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime  gmt_close;
    /**
     * 支付金额信息
     * 支付成功的各个渠道金额信息
     */
    private JSONArray fund_bill_list;
    /**
     * 公共回传参数，如果请求时传递了该参数，则返回给商户时会在异步通知时将该参数原样返回
     */
    private String passback_params;
    /**
     * 优惠券信息
     */
    private String voucher_detail_list;

    public JSONObject toJSON() {
        return JSONUtil.parseObj(this);
    }

    @Override
    public String toString() {
        JSONObject entity = toJSON();
        for (String key : entity.keySet()) {
            System.out.println(key + ": " + entity.get(key));
        }
        return entity.toString();
    }
}
